﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace StarControl
{
    class Colisao : God
    {
        public Colisao(Game game)
            : base(game)
        {

        }

        protected List<ArmaPrimaria> recuperaComponentesArmaPrimaria()
        {
            return recuperaComponentes<ArmaPrimaria>();
        }

        protected List<Obstaculo> recuperaComponentesObstaculos()
        {
            return recuperaComponentes<Obstaculo>();
        }

        public List<MissilTeleguiado> recuperaComponentesMisseis()
        {
            return recuperaComponentes<MissilTeleguiado>();
        }

        public List<Explosao> recuperaComponentesExplosao()
        {
            return recuperaComponentes<Explosao>();
        }


        public int recuperaComponentesMisseisTotal()
        {
            return recuperaComponentes<MissilTeleguiado>().Count();
        }


        public bool ocorreuColisaoNaveMeteoro(Nave nave, bool especial=false)
        {
            if (especial && nave.getEscudo().getSituacao())
            {
                Console.WriteLine(" Invisibilidade habilitada");
            }
            else
            {
                Rectangle escudoRec = new Rectangle((int)nave.getPosition().X - ((int)nave.getImagem().Width/2),
                                                    (int)nave.getPosition().Y - ((int)nave.getImagem().Height/2),
                                                    (int)nave.getImagem().Width, (int)nave.getImagem().Height);

                /* Verifica a colisão com os asteroids */
                List<Obstaculo> asteroids = recuperaComponentesObstaculos();
                foreach (Obstaculo prime in asteroids) // Loop through List with foreach
                {
                    Rectangle obstaculo = new Rectangle((int)prime.getPosition().X - ((int)prime.getImagem().Width/2),
                                                        (int)prime.getPosition().Y - ((int)prime.getImagem().Height/2),
                                                        (int)prime.getImagem().Width, (int)prime.getImagem().Height);
                    if (obstaculo.Intersects(escudoRec))
                    {
                        prime.Dispose();
                        return true;
                    }
                }
            }
            return false;
        }

        public bool ocorreuColisaoEscudoBasico(Escudo escudoBasico)
        {
            if (escudoBasico != null && escudoBasico.getImagem() != null)
            {
                Rectangle escudoBasicoRec = new Rectangle((int)escudoBasico.getPosition().X - ((int)escudoBasico.getImagem().Width/2),
                                                          (int)escudoBasico.getPosition().Y - ((int)escudoBasico.getImagem().Height/2),
                                                          (int)escudoBasico.getImagem().Width, (int)escudoBasico.getImagem().Height);

                /* Verifica a colisão com os asteroids */
                List<Obstaculo> asteroids = recuperaComponentesObstaculos();
                foreach (Obstaculo prime in asteroids) // Loop through List with foreach
                {
                    Rectangle obstaculo = new Rectangle((int)prime.getPosition().X - ((int)prime.getImagem().Width/2),
                                                        (int)prime.getPosition().Y - ((int)prime.getImagem().Height/2),
                                                        (int)prime.getImagem().Width, (int)prime.getImagem().Height);
                    if (obstaculo.Intersects(escudoBasicoRec))
                    {
                        prime.Dispose();
                        return true;
                    }
                }
                Nave n = escudoBasico.getOwner();

                /* verifica a colisão com misseis*/
                List<MissilTeleguiado> misseis = recuperaComponentesMisseis();
                foreach (MissilTeleguiado missel in misseis) // Loop through List with foreach
                {
                    /* Verifica se não é a nave que atirou, se for não haverá colisão */
                    if (missel.getOwner() != n)
                    {
                        Rectangle obstaculo = new Rectangle((int)missel.getPosition().X - ((int)missel.getImagem().Width/2),
                                                            (int)missel.getPosition().Y - ((int)missel.getImagem().Height/2),
                                                            (int)missel.getImagem().Width, (int)missel.getImagem().Height);
                        if (obstaculo.Intersects(escudoBasicoRec))
                        {
                            missel.Dispose();
                            return true;
                        }
                    }
                }
            }
            return false;
        }

        public void ocorreuColisaoTiroMeteoro()
        {

            List<ArmaPrimaria> listaArmas = recuperaComponentesArmaPrimaria();

            /* Verifica a colisão com os asteroids */
            List<Obstaculo> obstaculos = recuperaComponentesObstaculos();

            foreach (ArmaPrimaria ap in listaArmas) // Loop through List with foreach
            {
                Rectangle apRec = new Rectangle((int)ap.getPosition().X, (int)ap.getPosition().Y,
                                                        (int)ap.getImagem().Width, (int)ap.getImagem().Height);
                foreach (Obstaculo obstac in obstaculos) // Loop through List with foreach
                {
                    Rectangle obstaculoRec = new Rectangle((int)obstac.getPosition().X - ((int)obstac.getImagem().Width/2),
                                                           (int)obstac.getPosition().Y - ((int)obstac.getImagem().Height/2),
                                                           (int)obstac.getImagem().Width, (int)obstac.getImagem().Height);
                    if (obstaculoRec.Intersects(apRec))
                    {

                        Explosao exp = new Explosao(getGame());
                        exp.setConfig(new Vector2(200,200));
                        exp.explodir();
                        getGame().Components.Add(exp);
                        Console.WriteLine("Explodaaa");
                        obstac.Dispose();
                        ap.Dispose();
                        // Recalcula a lista de Obstaculos
                        obstaculos = recuperaComponentesObstaculos();
                    }
                }
            }
        }
    }
}
